package com.second.client.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.second.client.dao.ClientCouponDao;
import com.second.client.dao.ClientCouponRecordDao;
import com.second.client.pojo.entity.ClientCouponRecord;
import com.second.client.pojo.vo.CouponRecordQueryVo;
import com.second.client.pojo.vo.PageVo;
import com.second.client.service.ClientCouponRecordService;
import com.second.client.util.PageData;
import com.second.common.pojo.R;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.time.LocalDateTime;

/**
 * (ClientCouponRecord)表服务实现类
 *
 * @author lvyongqi
 * @since 2021-07-25 14:49:53
 */
@Service("clientCouponRecordService")
public class ClientCouponRecordServiceImpl extends ServiceImpl<ClientCouponRecordDao, ClientCouponRecord> implements ClientCouponRecordService {

    /**
     * 优惠券记录dao接口服务对象
     */
    @Resource
    private ClientCouponRecordDao clientCouponRecordDao;
    /**
     * 优惠券dao接口服务对象
     */
    @Resource
    private ClientCouponDao clientCouponDao;


    /**
     * 获取所有的优惠券记录
     * @return 所有数据
     */
    @Override
    public R getAllCouponRecord(PageVo pageVo, CouponRecordQueryVo couponRecordQueryVo) {
        // 开启分页
        Page<ClientCouponRecord> page = new Page<>(pageVo.getCurrentPage(), pageVo.getPageSize());

        // 将获取到的page对象和前台传递的参数传递到自己写的sql查询方法，注意：返回值类型一定要是Page<T>
        Page<ClientCouponRecord> clientCouponRecordPage =
                clientCouponRecordDao.getAllCouponRecord(page,couponRecordQueryVo);

        return PageData.returnPage(page,clientCouponRecordPage);
    }

    /**
     * 客户领取优惠券记录，往优惠券记录表中插入一条数据
     * @param couponId 优惠券Id
     * @param clientId 客户Id
     * @return 插入结果
     */
    @Override
    @Transactional
    public R collectCoupon(Integer couponId, Integer clientId) {
        // 获取该优惠券的结束时间，判断该优惠券的结束时间是否大于当前领取时间
        String endTime = clientCouponDao.selectById(couponId).getEndTime();
        // 获取当前时间
        String nowTime = LocalDateTime.now().toString();
        // 返回正值是代表左侧日期大于参数日期，反之亦然
        if (endTime.compareTo(nowTime) > 0 ) {
            // 判断该用户是否领过同一个优惠券
            ClientCouponRecord hasCoupon = this.isHasCoupon(couponId, clientId);
            if (hasCoupon != null) {
                return R.error().putObject("不可重复领取");
            }else {
                // 改变优惠券表中的领取数量
                boolean update = clientCouponDao.changeReceiveCount(couponId);
                // 往优惠券记录表中插入一条记录
                ClientCouponRecord clientCouponRecord = new ClientCouponRecord();
                clientCouponRecord.setCouponId(couponId);
                clientCouponRecord.setClientId(clientId);
                boolean save = this.save(clientCouponRecord);

                if (update == true && save == true) {
                    return R.success();
                }else {
                    return R.error();
                }
            }
        }else {
            return R.error().putObject("该优惠券活动已结束");
        }

    }

    /**
     * 客户使用优惠券记录，往优惠券记录表中得优惠券使用时间和使用状态
     * @param couponId 优惠券Id
     * @param clientId 客户Id
     * @return 插入结果
     */
    @Override
    public R useCoupon(Integer couponId, Integer clientId) {

        // 首先判断该用户是否拥有该优惠券
        ClientCouponRecord hasCoupon = this.isHasCoupon(couponId, clientId);
        if (hasCoupon == null || hasCoupon.getUseStatus() == 1 ) {
            return R.error().putObject("优惠券不可使用");
        }else {
            // 改变优惠券表的使用数量
            boolean update = clientCouponDao.changeUseCount(couponId);
            // 改变优惠券记录表中的优惠券使用状态和使用时间
            boolean change = clientCouponRecordDao.updateUseStatusById(hasCoupon.getId());
            if (update == true && change == true) {
                return R.success();
            }else {
                return R.error();
            }
        }

    }

    /**
     * 判断用户是否拥有优惠券
     * @param couponId 优惠券Id
     * @param clientId 客户Id
     * @return 优惠券记录实例
     */
    private ClientCouponRecord isHasCoupon(Integer couponId, Integer clientId) {
        QueryWrapper<ClientCouponRecord> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("client_id",clientId);
        queryWrapper.eq("coupon_id",couponId);
        queryWrapper.eq("claim_status",1);
        return this.getOne(queryWrapper);
    }

}
